#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
void work(int cnt)
{
        while(cnt)
        {
        printf("I am a child process,pid:%d,ppid:%d,cnt:%d\n",getpid(),getppid(),cnt--);
        sleep(1);
        }
}
void task1()
{
    printf("I am working task1\n");
}

void task2()
{
    printf("I am working task2\n");
}
void task3()
{
    printf("I am working task3\n");
}
void task4()
{
    printf("I am working task4\n");
}
//父进程等待回收子进程可以干嘛
int main()
{
    pid_t id=fork();
    if(id==0)
    {
        //child
        work(1);
    }
    else{
       while(1)
       {
             int status=0;
             pid_t rid = waitpid(id,&status,WNOHANG);
             if(rid>0)
             {
                 printf("wait child process success,pid:%d\n,exit code:%d",getpid(),WEXITSTATUS(status));
                 break;
             }
             else if(rid==0)
             {
                 sleep(1);
                 printf("wait child process success,process not finish\n");
                 task1();
                 task2();
                 task3();
                 task4();
             }
             else
             {
                printf("wait child process failed");
                break;
             }
       }


    }
}














//创建多个进程的进程等待
//int main()
//{
//    for(int i =0; i<10;i++)
//    {
//        pid_t id=fork();
//       if(id==0)
//       {
//           //child
//           work(i);
//           exit(0);
//       }   
//   }
//
//       for(int i =0;i<10;i++) 
//       {
//           //father
//           int status=0;
//           pid_t rid =waitpid(-1,&status,0);
//           if(rid>0)
//           {   
//               printf("wait child process success,exit code:%d\n",WEXITSTATUS(status));
//           }
//       }
//
//   return 0;
//}

//waitpid 进程等待
//const int cnt=5;
//int main()
//{
//    pid_t id=fork();
//    if(id==0)
//    {
//        work(cnt);
//        exit(0);
//    }
//    else
//    {
//        printf("wait before\n");
//        int status=0;
//        pid_t rid = waitpid(id,&status,0);
//        printf("wait after\n");
//        if(id==rid)
//        {
//            // printf("wait child process success,pid:%d,rid,%d,exit sig:%d,exit code:%d \n",getpid(),rid,status&0x7F,(status>>8)&0xFF);
//            if(WIFEXITED(status))
//            {
//                printf("child process normal quit,exit code:%d\n",WEXITSTATUS(status));
//            }
//            else{
//                printf("child process quit except!\n");
//            }
//        }
//
//    }
//
//
//    return 0;
//}








//wait 程序等待
//int main()
//{
//    pid_t id = fork();
//    if(id==0)
//    {
//        //child
//        work();
//        exit(1);
//    }
//    else
//    {
//        //father
//        sleep(10);
//        pid_t rid = wait(NULL);
//        if(rid==id)
//        {
//            printf("wait child success\n");
//        }
//    }
//}



//进程退出
//int func()
//{
//        printf("call func function done\n");
//            _exit(10);  
//
//}
//
//int main()
//{   
//    func();
//    printf("I am a process,pid:%d,ppid:%d\n",getpid(),getppid());
//    _exit(11);
//}
